"""
@name : 练习
@author : FengZT_19
@projectname: Scxuexi
"""
# 1、输入数字n，输出n天前的日期（time或者datatime模块）
# import datetime
# n = input('请输入一个整数:')
# try:
#     n = int(n)
#     # 获取当前日期
#     now_time = datetime.datetime.now()
#     # 计算前移天数
#     # datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
#     offset = datetime.timedelta(days=-n)
#     # 获取n天前的日期
#     lastn_time = (now_time + offset).strftime('%Y/%m/%d')
#     print(f'{n}天前的日期为：{lastn_time}')
# except ValueError as ve:
#     print("输入的类型不正确，请输入整数")

# 2、输出指定文件夹下有哪些文件或文件夹（实现ls命令， os）
# import os
# file = os.listdir('E:\Scxuexi')
# # listdir返回的是list类型
# for i in file:
#     print(i)

# 3、列表去重，并且从小到大排序
# lst1 = [2, 2, 1, 5, 6, 2, 8, 7]
# lst2 = sorted(list(set(lst1)), reverse=False)
# print(lst2)

# 4、如何在一个函数内部修改全局变量
# x = 1
#
# def change():
#     global x
#     x = 12
#     return x
#
# change()
# print(x)

# 5、如何跨模块共享全局变量
# import config
# print(config.x)

#6、python的基本数据类型有哪些？
# 字符串 str
# 整型 int
# 浮点型 float
# 复数 complex
# 布尔类型 Booleans
# 常量

# 7、python中生成随机整数（1-10），随机小数（1-10），随机小数（0-1）的方法
# import random
# print(random.randint(1, 10))
# print(random.uniform(1, 10))
# print(random.uniform(0, 1))

# 8、python中哪些是可变数据类型，哪些是不可变数据类型
# 可变数据类型：集合，列表
# 不可变数据类型：元组，字符串，整型，浮点型

# 9、a+=1与a=a+1有什么区别
# #########a=a+2，表示一个新的对象，新的对象名字还是a，但是指向的内存地址已经变了
# a = 1
# print(f'1==>{id(a)}')
# a = a + 1
# # 内存地址改变
# print(f'2==>{id(a)}')
# # 内存地址改变
# tuple1 = (1,)
# print(f'1==>{id(tuple1)}')
# tuple1 = tuple1 + (2,)
# # 内存地址改变
# print(f'2==>{id(tuple1)}')
# # 内存地址改变
# list1 = [1]
# print(f'1==>{id(list1)}')
# list1 = list1 + [2]
# print(f'2==>{id(list1)}')

# ######a+=1，对于有些对象的操作是表示原来的对象，对有些对象的操作是生成了一个新对象
# ###对于不可变操作对象，操作完后，内存地址发生变化
# # 不可变数据类型==》内存地址改变
# b = 1
# print(f'1==>{id(b)}')
# b += 1
# print(f'2==>{id(b)}')
# # 可变数据类型==>内存地址不变
# list1 = [1]
# print(f'1==>{id(list1)}')
# list1 += [2]
# print(f'2==>{id(list1)}')

# 10、什么是pep8？说出5点它的标准
# 每一级缩进使用4个空格
# 所有行限制的最大字符数为79。
# 顶层函数和类的定义，前后用两个空行隔开。
# 导入总是位于文件的顶部，在模块注释和文档字符串之后，在模块的全局变量与常量之前。
# 行内注释是与代码语句同行的注释。行内注释和代码至少要有两个空格分隔。注释由#和一个空格开始。

# 11、给定一个字符串，找出字符串第一个重复的字符
# str1 = 'fyy shi sha zhu'
# for i in str1:
#     if str1.count(i) >= 2 and i != ' ':
#         print(i)
#         break
#     else:
#         continue

# 12、简述深拷贝与浅拷贝
# 容器类型里包含可变容器类型的情况才会有深浅拷贝的区别
# 浅拷贝对于容器包含容器的这种拷贝,只会拷贝第一层地址
# 可以理解为引用了被包含容器的地址，然后用一层新的地址包装这些被包含容器的地址。
# 然后这就导致了原和拷贝的地址不一样，但是里边的容器还是一样的东西没有变。
# 会拷贝每一层的值
# 修改拷贝后的对象不会影响原对象

# 13、简述python内存机制
# 引用计数器为主,标记清除和分代回收为辅。
# 还引用了小整型缓冲池以及常用字符串驻留区的方式进行内存分配管理

# 14、使用python实现冒泡排序，快速排序
# 冒泡排序
# list1 = [11, 56, 3, 41, 62, 18]
list1 = [5,4,3,2,1]
length = len(list1)
flag = 1
for j in range(length, 0, -1):
    for i in range(length-1):
        print(list1)
        if list1[length-i-1] > list1[length-i-2]:
            list1[length-i-1], list1[length-i-2] = list1[length-i-2], list1[length-i-1]
            flag = 0

    if flag == 1:
        break
# print(list1)

# 快速排序
# import numpy as np
# import sys
#
# # 设置随机种子
# np.random.seed(0)
# # 得到一组随机数
# nums = np.random.randint(10, size=(8))
# # nums=np.array([1,3,2,2])
# print(nums)
#
#
# # 选择每组数的第一个作为基准数
# def QuickSort(nums, left, right):
#     if left >= right:
#         return 0
#     baseNumber = nums[left]
#     i = left
#     j = right
#     while i != j:
#         while j > i and nums[j] >= baseNumber:
#             j -= 1
#         if j > i:
#             # 实现两个元素的互换
#             nums[i], nums[j] = nums[j], nums[i]
#
#         while i < j and nums[i] <= baseNumber:
#             i += 1
#         if i < j:
#             nums[i], nums[j] = nums[j], nums[i]
#     QuickSort(nums, left, i - 1)
#     QuickSort(nums, i + 1, right)
#
#
# QuickSort(nums, 0, nums.size - 1)
# print(nums)


# 15、验证一个字符串是否属于回文（从左到右，从右到左都是一样)
# str1 = input("请输入一个字符串：")
# if str1 == str1[::-1]:
#     print("该字符串是回文")
# else:
#     print("该字符串不是回文")


# 要求
# 提取出weblog.txt里面的ip字段、时间字段、带宽字段
# 每个字段都是以空白作为分割   ip字段在第一个  时间字段在第四个 带宽字段在第10个
# 首先将时间格式都统一转化为 2021-06-04 04:00:20  （time）
# 通过ip 去解析出它的省份和运营商是什么    （requests，json）
# https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip=106.11.159.66
# isp就是运营商字段   region就是省份字段
# 最后将得到的  时间、省份、运营商、带宽字段按如下格式写入文件
# 2021-06-04 04:00:20,湖南,电信,1004
# import requests
# import json
# import time
#
# with open('weblog.txt', 'r') as fp:
#     with open('ip_information.txt', 'a', encoding='utf-8') as fl:
#         fl.truncate(0)
#         # 获取每一行的值
#         for i in fp.readlines():
#             # 获取行号
#             # 每一行按空格分割
#             list1 = i.split(' ')
#             # 得到ip字段
#             p = list1[0]
#             # 得到时间字段
#             old_time = list1[3]
#             # 转换成时间数组
#             old_time = time.strptime(old_time, "[%d/%b/%Y:%H:%M:%S")
#             # 转换时间格式 [04/Jun/2021:06:02:12  ==>  2021-06-04 04:00:20
#             new_time = time.strftime("%Y-%m-%d %H:%M:%S", old_time)
#             # # 得到带宽字段
#             bw = list1[9]
#             r = requests.get(url=f'https://ip.taobao.com/outGetIpInfo?accessKey=alibaba-inc&ip={p}')
#             # r.text为请求得到的数据解码后的内容
#             # 将其转化为字典
#             ifm = json.loads(r.text)
#             # 省份
#             region = ifm['data']['region']
#             # 运营商
#             isp = ifm['data']['isp']
#             # 写入文件
#             fl.write(f'时间：{new_time},省份：{region},运营商：{isp},带宽：{bw}\n')
